import tornado
import tornado.options
from tornado.web import Application, RequestHandler
import json

'''
    对应每个请求的处理类Handler在构造一个实例后首先执行initialize()方法。
    在讲输入时提到，路由映射中的第三个字典型参数会作为该方法的命名参数传递
    很少使用！
'''
class ProfileHandler(RequestHandler):
    def initialize(self, database):
        self.database = database

    def get(self):
        databases = self.database
        self.write('你好！')

'''
    预处理，即在执行对应请求方式的HTTP方法（如get、post等）前先执行，
    注意：不论以何种HTTP方式请求，都会执行prepare()方法。
'''
class IndexHandler(RequestHandler):
    #对请求进行预处理！
    def prepare(self):
        if self.request.headers.get("Content-Type").startswith("application/json"):
            self.json_dict = json.loads(self.request.body.decode())
        else:
            self.json_dict = None

    def post(self):
        if self.json_dict:
            for key, value in self.json_dict.items():
                self.write("<h3>%s</h3><p>%s</p>" % (key, value))

    def put(self):
        if self.json_dict:
            for key, value in self.json_dict.items():
                self.write("<h3>%s</h3><p>%s</p>" % (key, value))


database = {'1':'2'}

app = Application([
    (r'/user/(.*)', ProfileHandler,dict(database=database)),
    (r'/',IndexHandler)
    ])



if __name__ == "__main__":
    tornado.options.parse_command_line()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()


'''
class IndexHandler(RequestHandler):

    def initialize(self):
        print("调用了initialize()")

    def prepare(self):
        #预处理，即在执行对应请求方式的HTTP方法（如get、post等）前先执行，
        #注意：不论以何种HTTP方式请求，都会执行prepare()方法。
        print("调用了prepare()")

    def set_default_headers(self):
        print "调用了set_default_headers()"

    def write_error(self, status_code, **kwargs):
        print "调用了write_error()"

    def get(self):
        print "调用了get()"

    def post(self):
        print "调用了post()"
        self.send_error(200)  # 注意此出抛出了错误

    def on_finish(self):
        #在请求处理结束后调用，即在调用HTTP方法后调用。
        #通常该方法用来进行资源清理释放或处理日志等。注意：请尽量不要在此方法中进行响应输出。
        print "调用了on_finish()"


'''
'''
    在正常情况未抛出错误时，调用顺序为：
        set_defautl_headers()
        initialize()
        prepare()
        HTTP方法
        on_finish()
        在有错误抛出时，调用顺序为：
        
        set_default_headers()
        initialize()
        prepare()
        HTTP方法
        set_default_headers()
        write_error()
        on_finish()

'''